EventBridgeとLambdaを使ってEC2の再起動を検知してメールで通知してみた

EventBridgeとLambdaを使ってEC2の再起動を検知してメールで通知してみた

AWS EventBridge、Lambda、SNSを使って、EC2インスタンスの再起動を自動検知し、管理者にメール通知する方法をご紹介します。 AWSリソースの柔軟な監視やクラウド運用の効率化に興味がある方に読んで欲しいブログです。
Clock Icon2025.01.20

どうもさいちゃんです。今回は EventBridge と Lambda を使って EC2 の再起動を検知し、SNS で担当者に通知する方法をご紹介します。

やりたいこと

EventBridge と Lmabda と SNS を使用して EC2 が再起動した際に任意のメッセージを管理者宛にメールで送信してみようと思います。
Ec2 の再起動を

構成図はこんな感じです。

cacco.png

作業の大まかな手順は以下の通りです。

  1. SNS トピックを作成する
  2. 1 で作成した SNS トピックを使用してメールを送信する Lambda 関数を作成する
  3. EC2 の再起動を検知した時に 2 で作成した Lambada 関数を呼び出すための EventBridge ルールを作成する

それではさっそくやってみましょう。

やってみる

SNS トピックの作成

まず初めに通知先となる SNS トピックを作成していきます。

AmazonSNS コンソールのナビゲーションペインから トピックを選択し、 トピックを作成から今回使用する SNS トピックの作成を始めます。

SNS-1.png

タイプは今回 スタンダードを選択しています。

分かりやすい名前を付けましょう。私は my-notify-sns-topicとしています。

SNS-2.png

他はデフォルトの設定でトピックを作成します。

トピックが正常に作成されたので、サブスクリプションとして自身のメールアドレスを登録していきます。
先ほど作成したトピックを選択し、詳細画面からサブスクリプションの作成を選択します。

SNS-3.png

トピック ARN が先ほど作成した「my-notify-sns-topic」のものになっていることを確認し、今回はメールアドレスに通知を飛ばしたいのでプロトコルに E メールを選択します。

エンドポイントに、自身のメールアドレスを設定しました。他の設定はデフォルトのままでサブスクリプションを作成します。

SNS-4.png

メールアドレスの確認を行うまではサブスクリプションのステータスが 保留中の確認となっているので、メールアドレスの確認を行っていきます。

SNS-5.png

先ほどエンドポイントとして設定したメールアドレス当てに下記の様に確認メールが来ています。

先ほど作成した SNS トピックからのメールで、このメールアドレスをサブスクリプションとして登録しても良い場合は、リンクをクリックしてメールアドレスの確認を行ってくださいという旨のメールです。

SNS-6.png

クリックすると下記のようなページが表示され、サブスクリプションの確認が成功したことが分かります。

SNS-7.png

コンソールも見てみましょう。

SNS-8.png

ステータスが確認済みになっています。これで SNS 側の準備は完了です。

Lambda 関数の設定

SNS の準備が終わったので今回作成する Lambda が SNS を呼び出すことが出来るように Lambda の実行ロールを作成してあげます。

IAM コンソールの左側のナビゲーションペインから ポリシーを選択してポリシーを作成します。

IAM-1.png

今回はビジュアルエディタを使ってコンソールから簡単にポリシーを生成してみます。
サービスを選択の項目で SNSを選択すると、アクション許可の選択ができるようになるので、 書き込みPublishにチェックを入れます。

IAM-2.png

リソースは すべてを選択します。

IAM-3.png

JSON エディタに切り替えてみると下記のような IAM ポリシーが勝手に作成されています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": "sns:Publish",
      "Resource": "*"
    }
  ]
}

このポリシーはアカウント内のすべての SNS トピックに対して、メッセージの送信を許可するポリシーです。
sns-publish-policyという名前で保存します。

IAM-4.png

次に特定の API コールイベント(今回は EC2 インスタンスの再起動)が発生した際に SNS を呼び出す為の Lambda 関数を作成していきます。

分かりやすい関数名を付けて以下の設定で関数を作成します。
今回は api-calls-notify-functionという名前でほかはデフォルト設定で関数を作成します。

Lambda-1.png

作成した Lambda 関数名をクリックし、関数の概要ページを表示します。
設定タブのアクセス権限を見てみましょう。

Lambda-3.png

作成した覚えはないのに実行ロール欄にロール名が記載されていますね。

デフォルト設定のままで Lambda 関数を作成すると、基本的な Lambda の実行権限を持ったロールを勝手に作成してくれます。
このロールに先ほど作成したポリシーをアタッチしてあげます。ロール名をクリックしてロールの詳細画面を表示させます。

許可ポリシーの 許可を追加から ポリシーをアタッチを選択します。
先ほど作成した sns-publish-policyにチェックを入れて、許可を追加します。

Lambda-4.png

許可ポリシーに sns-publish-policyが追加されていれば OK です。

Lambda-5.png

では Lambda の画面に戻って設定を続けます。
コードソース内の既存のコードを以下に置き換えます。

import SNS from "@aws-sdk/client-sns";
const snsClient = new SNS.SNSClient();

export const handler = async (event) => {
  const subject = "EC2インスタンスが再起動しました。";
  const message = "EC2インスタンスの再起動を検知しました。対応してください。";
  const topicArn = "SNSトピックARNを記入";

  try {
    const response = await snsClient.send(
      new SNS.PublishCommand({
        Message: message,
        Subject: subject,
        TopicArn: topicArn,
      })
    );
    console.log(response);
    return response;
  } catch (error) {
    console.error(error);
    throw error;
  }
};

そのままデプロイします。

Lambda-2.png

Lambda 関数が正常に更新されたことを確認し、テストしてみましょう。

先ほど SNS にサブスクリプションとして登録したメールアドレスに下記のようなメールが届いていれば成功です。

Lambda-6.png

次は EventBridge ルールを作成していきます。

EventBridge の設定

上記で作成した Lambda 関数が EC2 インスタンスが再起動されるたびに実行されるように EventBridge ルールを作成していきます。

EventBridge コンソールのナビゲーションペインからルールを選択し、ルールの作成をしていきます。

EventBridge-1.png

ルール名は分かりやすければ何でもいいです。今回は monitaring-RebootInstance-eventとしました。
ほかはデフォルト設定のまま、次へ進みます。

EventBridge-2.png

イベントソースは AWS イベントまたは EventBridge パートナーイベントを選択します。

EventBridge-3.png

イベントパターンは下記の通り設定します。

項目 設定値
イベントソース AWS のサービス
AWS のサービス EC2
イベントタイプ AWS API Call via CloudTrail
イベントタイプの仕様 特定のオペレーション
特定のオペレーション RebootInstance

EventBridge-4.png

特定のオペレーションの項目を変えれば、様々な API コールに関してこの先ほど作った Lmabda 関数を呼び出すことが出来るようになります。
例えば、EC2 が停止したときだけ通知を行いたい場合は「StopInstance」とするといった具合です。

コンソールでポチポチしていけば、勝手にイベントパターンを作成してくれます。
作成されたイベントパターンを見てみるとこんな感じになってます。

{
  "source": ["aws.ec2"],
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "eventSource": ["ec2.amazonaws.com"],
    "eventName": ["RebootInstance"]
  }
}

上記であればあまりコーディングの知識がなくても簡単にイベントパターンを作成することが出来ますが、さらに複雑な条件で Lambda を起動させたい場合はイベントパターンを直接作成するのが良いと思います。

より複雑なイベントパターンの作成には下記のブログが参考になりそうです。

https://dev.classmethod.jp/articles/amazon-eventbridge-enhanced-filtering-capabilities/

https://dev.classmethod.jp/articles/amazon-eventbridge-wildcard-filters-rules/

今回はこのイベントパターンで Lambda を呼び出すのでこのまま次へ進みます。

ターゲットの選択画面へ移るのでターゲットタイプを AWS のサービスにしてドロップダウンリストから Lambda 関数を選択します。

関数の項目のドロップダウンリストを確認するとアカウント内に作成済みの関数の候補が出てくるので、先ほど作成した関数を設定して次へ進みます。

EventBridge-5.png

タグが必要な場合は適切に設定して、設定内容を確認しましょう。問題なければルールを作成します。

テスト

すべてのリソースが作成されたら、実際に動くかテストをしてみましょう。

何でもいいので EC2 を作成して再起動をしてみます。
私の場合はちょうど検証用に立てていた EC2 があったのでそちらで試してみました。

test-1.png

テストをしてみると、再起動直後にきちんとメールが飛んできました!
私の場合は再起動してから、数秒でメールが届いていました。

test-2.png

終わりに

今回ご紹介した方法の様に EventBrige のイベントソースとして CloudTrail によって記録された API コールを指定してあげれば、EC2 の再起動や停止に限らず様々なイベントを検知したときに SNS でメール通知を行うことが可能です。
Lambda をうまく作り込めば日本語で任意のメッセージが送られてくるように設定が可能なのも嬉しいポイントですね。
本ブログが EC2 の再起動の検知を行いたい方のお役に立てたらうれしいです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.